package com.jdjc.gateway.filter;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 *
 * // 定义一个类实现GlobalFilter接口，用于定义全局登录拦截器。
 */
//@Component // 将这个类标记为Spring组件，以便Spring容器可以管理这个类的实例。
@Slf4j
public class  LoginFilter implements GlobalFilter {
    @Override
    @SneakyThrows // Lombok注解，允许方法抛出异常而不需要在方法签名中声明。
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { // 重写filter方法，用于处理请求。
        ServerHttpRequest request = exchange.getRequest(); // 从exchange中获取当前的HTTP请求。
        ServerHttpRequest.Builder mutate = request.mutate(); // 创建一个请求构建器，用于修改请求。
        String url = request.getURI().getPath(); // 获取请求的URL路径。
        log.info("LoginFilter:filter:url:{}", url);
        // 如果请求的URL是登录接口，则直接放行。
        if (url.equals("/user/doLogin")) {
            chain.filter(exchange);
        }
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo(); // 获取当前请求的令牌信息。
        String loginId = (String) tokenInfo.getLoginId(); // 从令牌信息中获取登录用户的ID。
        if (loginId == null) {
            throw new Exception("没有获取到用户信息");
        }
        // 向请求中添加一个名为"loginId"的头信息，值为用户的ID。
        mutate.header("loginId", loginId);
        //修改HTTP请求，然后将修改后的请求传递给filter链中的下一个filter
        return chain.filter(exchange.mutate().request(mutate.build()).build());
    }
}
